1 /*
2 Copyright: Marcelo S. N. Mancini (Hipreme|MrcSnm), 2018 - 2021
3 License:   [https://creativecommons.org/licenses/by/4.0/|CC BY-4.0 License].
4 Authors: Marcelo S. N. Mancini
5 
6 	Copyright Marcelo S. N. Mancini 2018 - 2021.
7 Distributed under the CC BY-4.0 License.
8    (See accompanying file LICENSE.txt or copy at
9 	https://creativecommons.org/licenses/by/4.0/
10 */
11 module hip.hipaudio.backend.openal.clip;
12 
13 version(OpenAL):
14 import hip.audio_decoding.audio;
15 import hip.hipaudio.audio;
16 import hip.hipaudio.audiosource;
17 import hip.hipaudio.backend.openal.player;
18 import hip.hipaudio.backend.openal.al_err;
19 import hip.hipaudio.backend.audioclipbase;
20 import bindbc.openal;
21 
22 /** 
23  * OpenAL Buffer works in the following way:
24  * If the buffer is streamed, it won't be owned by any source, so it will have total control
25  * over itself. That way, it can be reused by any source.
26  *
27  * Else, the buffer will be owned by the source for decoding, updating, and pulling data.
28  *
29  */
30 public class HipOpenALClip : HipAudioClip
31 {
32     this(IHipAudioDecoder decoder, HipAudioClipHint hint){super(decoder, hint);}
33     this(IHipAudioDecoder decoder, HipAudioClipHint hint, uint chunkSize){super(decoder, hint, chunkSize);}
34     
35     override void onUpdateStream(ubyte[] data, uint decodedSize){}
36 
37     /** Allocates ALuint in the bufferwrapper */
38     override HipAudioBufferWrapper createBuffer(ubyte[] data)
39     {
40         // import hip.console.log;
41         HipAudioBufferWrapper w;
42         alGenBuffers(1, &w.buffer.al);
43         alCheckError("Error generating OpenAL Buffer");
44         hasBuffer = true;
45         return w;
46     }
47 
48     override void destroyBuffer(HipAudioBuffer* buffer)
49     {
50         alDeleteBuffers(1, &buffer.al);
51         alCheckError("Error deleting OpenAL Buffer");
52     }
53 
54     override void setBufferData(HipAudioBuffer* buffer, ubyte[] data, uint size = 0)
55     {
56         alBufferData(
57             buffer.al,
58             HipOpenALAudioPlayer.config.getFormatAsOpenAL,
59             data.ptr,
60             size == 0 ? cast(int)data.length : size,
61             decoder.getSamplerate()
62         );
63         alCheckError("Error setting OpenAL Buffer Data");
64     }
65 
66     bool hasBuffer;
67 
68 }